﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace FXnaInfrastructure
{
    [Serializable]
    public class GeoLongLatBase : PropertyChangedBase
    {


        protected double _value;

        /// <summary>
        /// 会有难以忍受的转换经度损失
        /// </summary>
        public virtual double Value
        {
            get { return this._value; }
            set
            {

                if (this._value!=value)
                {

                    if (value > 90 || value < -90)
                    {
                        return;

                    }

                    this._value = value;
                    

                    
                }


             



            }
        }



        //protected int _degree;

        //public virtual int Degree
        //{
        //    get { return _degree; }
        //    set
        //    {




        //        if (_degree != value)
        //        {
        //            if (value > 90 || value < -90)
        //            {

        //                return;
        //            }


        //            _degree = value;


        //            this.OnPropertyChanged("Degree");

        //            this.OnPropertyChanged("Value");



        //        }


        //    }
        //}




        //int _minute;

        //public int Minute
        //{
        //    get { return _minute; }
        //    set
        //    {


        //        if (this._minute != value)
        //        {

        //            if (value >= 60 || value < 0)
        //            {
        //                return;

        //            }




        //            _minute = value;

        //            this.OnPropertyChanged("Minute");

        //            this.OnPropertyChanged("Value");


        //        }

        //    }
        //}



        //int _second;

        //public int Second
        //{
        //    get { return _second; }
        //    set
        //    {


        //        if (this._second != value)
        //        {
        //            if (value < 0 || value >= 60)
        //            {
        //                return;
        //            }


        //            _second = value;

        //            this.OnPropertyChanged("Second");

        //            this.OnPropertyChanged("Value");


        //        }




        //    }
        //}


        public virtual void SetValueWithString(string str)
        {
            string val= str.Substring(0,str.Length-1);

            this.Value = Convert.ToDouble(val);



 
        }




        /// <summary>
        /// 留给子类实现
        /// </summary>
        /// <returns></returns>
        public virtual string GetValueWithString()
        {
            throw new NotImplementedException();
 
        }




        //提供两个辅助函数

        public static double GetValueFromDMS(int degree,int minute,int second)
        {
            double d = degree + minute / 60.0d + second / 3600.0d;

            return d;
 
        }


       
        /// <summary>
        /// 
        /// </summary>
        /// <param name="value"></param>
        /// <returns>本别表示度分秒的int</returns>
        public static int[] GetDMSFromValue(double d)
        {
            int[] dms = new int[3];


            int Degree = Convert.ToInt16(Math.Truncate(d));//度

            d = d - Degree;
            int M = Convert.ToInt16(Math.Truncate((d) * 60));//分

            int S = Convert.ToInt16(Math.Round((d * 60 - M) * 60));

            if (S == 60)
            {

                M = M + 1;
                S = 0;
            }
            if (M == 60)
            {

                M = 0;
                Degree = Degree + 1;
            }


            dms[0] = Degree;
            dms[1] = M;

            dms[2] = S;


            return dms;




 

        }




        //public double GetValue()
        //{

        //    double d = this._degree + this._minute / 60.0d + this._second / 3600.0d;

        //    return d;


        //}





        //public void OnValueChanged(double d)
        //{

        //    int Degree = Convert.ToInt16(Math.Truncate(d));//度

        //    d = d - Degree;
        //    int M = Convert.ToInt16(Math.Truncate((d) * 60));//分

        //    int S = Convert.ToInt16(Math.Round((d * 60 - M) * 60));

        //    if (S == 60)
        //    {

        //        M = M + 1;
        //        S = 0;
        //    }
        //    if (M == 60)
        //    {

        //        M = 0;
        //        Degree = Degree + 1;
        //    }


        //    this._degree = Degree;
        //    this._minute = M;

        //    this._second = S;


        //    this.OnPropertyChanged("Value");

        //    this.OnPropertyChanged("Degree");

        //    this.OnPropertyChanged("Minute");

        //    this.OnPropertyChanged("Second");




        //    //string rstr = Degree.ToString() + ".";
        //    //if (M < 10)
        //    //{
        //    //    rstr = rstr + "0" + M.ToString();
        //    //}
        //    //else
        //    //{
        //    //    rstr = rstr + M.ToString();
        //    //}

        //    //if (S < 10)
        //    //{
        //    //    rstr = rstr + "0" + S.ToString();
        //    //}
        //    //else
        //    //{
        //    //    rstr = rstr + S.ToString();
        //    //}






        //}





    }
}
